Aurora MySQLの監査ログをCloudWatch Logs Insightで確認する
Aurora MySQLの監査ログをCloudWatch Logs Insightで確認する方法をご紹介します。CW Insightでクエリを実行し、監査ログを効率的に確認できます。
パラメーターグループの作成
DBクラスターパラメーターグループを作成します。
パラメータグループを編集します。server_audit_logging
を1
にし、
server_audit_events
はCONNECT, QUERY, QUERY_DCL, QUERY_DDL, QUERY_DML, TABLE
としました。
監査ログから除外するユーザーをserver_audit_excl_users
で指定できます。また、ログに含めるユーザをserver_audit_incl_users
で指定できます。今回はどちらも指定しませんでした。この場合は全てのユーザーが記録されます。
Amazon Auroraの作成
DB クラスターのパラメータグループに作成したパラメーターグループを指定します。
CloudWatch Logsに監査ログをエクスポートします。
CloudWatchロググループへの反映
CloudWatchコンソールを見ると、ロググループ「/aws/rds/cluster/<Auroraクラスタ名>/audit」が作成されます。
ログストリーム名は、<DBインスタンス名>.audit.log.N.YYYY-MM-DD-HH-MI.0.Nの形式です。ログストリームを選択すると、ログを確認できます。
CloudWatch Logs Insightsで確認
CloudWatch Logs Insightsでクエリを実行し、ログを確認します。ロググループと時間を選択します。キャプチャは過去30分を指定していますが、12/1 00:00〜12/2 23:59までといった指定も可能です。ログ20件を時間でソートして表示します。
クエリは以下の通りです。
fields @timestamp, @message | sort @timestamp desc | limit 20
クエリ結果は以下のように表示されます。
結果はmarkdownやCSVでエクスポートできます。
ログのパース
@messageとしてまとめて表示されているので、parseしてみます。以下のクエリを実行します。
parse "*,*,*,*,*,*,*,*,*,*" as timestamp,serverhost,username,host,connectionid,queryid,operation,database,object,retcode
ログが各要素ごとに分かれて表示されています。
DBユーザーadminからの接続のみを表示します。
parse "*,*,*,*,*,*,*,*,*,*" as timestamp,serverhost,username,host,connectionid,queryid,operation,database,object,retcode | filter username = 'admin'
クエリ結果から、CREATE DATABASE mydb
やCREATE TABLE
などを実行した様子がわかります。
接続元ごとのログ件数を表示します。
parse "*,*,*,*,*,*,*,*,*,*" as timestamp,serverhost,username,host,connectionid,queryid,operation,database,object,retcode | stats count() by host
接続元ごとのログ件数を表示されました。
簡易的ではありますが、可視化も可能です。時間軸に対するログ件数を表示します。1分ごとのログ件数をグラフにします。
parse "*,*,*,*,*,*,*,*,*,*" as timestamp,serverhost,username,host,connectionid,queryid,operation,database,object,retcode | stats count () by bin(1m)
グラフは以下のような形です。
まとめ
CloudWatch Logs Insightで監査ログを集計しました。集計は比較的簡単にできますので本記事のクエリを参考にしていただければ幸いです。
検証環境
- エンジンバージョン:5.7.mysql_aurora.2.07.0